Адміністрація вирішила продати даний сайт. За детальною інформацією звертайтесь за адресою: rozrahu@gmail.com

Лабораторна №2

Інформація про навчальний заклад

ВУЗ:
Інші
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Лабораторна робота
Предмет:
Системне програмне забезпечення

Частина тексту файла

Тема: «Взаємодія між потоками» Мета: Засвоїти поняття «процесів» та «потоків» як основних компонентів сучасних операційних систем. Здобути навики створення, керування та знищення «процесів» та «потоків» в операційній системі Windows. Завдання: Відповідно до варіанту (таблиця) модифікувати програму так, щоб замінити об’єкти синхронізації заданого числа потоків Таблиця – Варіанти завдань Системний виклик Варіант   5  Critical Section 4  Mutex 3  Semaphores    Вікно програми результату дослідження стандартної програми: Текст модифікованої програми: #include "stdafx.h" #include "EvryThng.h" #include <time.h> #include <stdlib.h> #include <locale.h> #define DATA_SIZE 256 typedef struct msg_block_tag { /* Message block */ volatile DWORD f_ready, f_stop; /* ready state flag, stop flag */ volatile DWORD sequence; /* Message block sequence number */ volatile DWORD nCons, nLost; short number; time_t timestamp; CRITICAL_SECTION mguard; /* Guard the message block structure */ HANDLE hMutex; DWORD checksum; /* Message contents checksum */ DWORD data[DATA_SIZE]; /* Message Contents */ } MSG_BLOCK; /* One of the following conditions holds for the message block */ /* 1) !f_ready || f_stop */ /* nothing is assured about the data OR */ /* 2) f_ready && data is valid */ /* && checksum and timestamp are valid */ /* Also, at all times, 0 <= nLost + nCons <= sequence */ /* Single message block, ready to fill with a new message */ MSG_BLOCK mblock = { 0, 0, 0, 0, 0, 0 }; unsigned int WINAPI produce (void *); unsigned int WINAPI consume (void *); unsigned int WINAPI _NULL_ (void *); unsigned int WINAPI _new_ (void *); void MessageFill (MSG_BLOCK *); void MessageDisplay (MSG_BLOCK *); DWORD _tmain (DWORD argc, LPTSTR argv[]) { unsigned int Status, ThId; HANDLE produce_h, consume_h, _null_h,_new_h; /* Initialize the message block CRITICAL SECTION */ InitializeCriticalSection (&mblock.mguard); mblock.number=1; printf("==============[ SYNCHRONIZATION CRITICAL SECTION]===============\n"); /* Create the two threads */ produce_h = (HANDLE)_beginthreadex (NULL, 0, produce, NULL, 0, &ThId); if (produce_h == NULL) printf("Cannot create producer thread"); consume_h = (HANDLE)_beginthreadex (NULL, 0, consume, NULL, 0, &ThId); if (consume_h == NULL) printf("Cannot create consumer thread"); _null_h = (HANDLE)_beginthreadex (NULL, 0, _NULL_, NULL, 0, &ThId); if (_null_h == NULL) printf("Cannot create _NULL_ thread"); _new_h = (HANDLE)_beginthreadex (NULL, 0, _new_, NULL, 0, &ThId); if (_new_h == NULL) printf("Cannot create _new_ thread"); /* Wait for the producer and consumer to complete */ Status = WaitForSingleObject (consume_h, INFINITE); if (Status != WAIT_OBJECT_0) printf("Failed waiting for consumer thread"); Status = WaitForSingleObject (produce_h, INFINITE); if (Status != WAIT_OBJECT_0) printf("Failed waiting for producer thread"); Status = WaitForSingleObject (_null_h, INFINITE); if (Status != WAIT_OBJECT_0) printf("Failed waiting for null thread"); Status = WaitForSingleObject (_new_h, INFINITE); if (Status != WAIT_OBJECT_0) printf("Failed waiting for _new_ thread"); DeleteCriticalSection (&mblock.mguard); _tprintf (_T("Producer, consumer, null and new threads have terminated\n")); _tprintf (_T("Messages produced: %d, Consumed: %d, Known Lost: %d\n"), mblock.sequence, mblock.nCons, mblock.nLost); Sleep(1000); printf("==============[ SYNCRNIZATION MUTEX ]===============\n"); mblock.nCons =0; mblock.f_ready =0; mblock.nLost =0; mblock.sequence =0; mblock.f_stop = 0; mblock.number=2; mblock.hMutex = CreateMutex( NULL, FALSE, NULL ); produce_h = NULL; consume_h = NULL; produce_h = (HANDLE)_beginthreadex (NULL, 0, produce, NULL, 0, &ThId); if (produce_h == NULL) printf("Cannot create producer thread"); consume_h =(HANDLE)_beginthreadex (NULL, 0, consume, NULL, 0, &ThId); if (consume_h == NULL) printf(...
Антиботан аватар за замовчуванням

15.12.2013 19:12

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Завантаження файлу

Якщо Ви маєте на своєму комп'ютері файли, пов'язані з навчанням( розрахункові, лабораторні, практичні, контрольні роботи та інше...), і Вам не шкода ними поділитись - то скористайтесь формою для завантаження файлу, попередньо заархівувавши все в архів .rar або .zip розміром до 100мб, і до нього невдовзі отримають доступ студенти всієї України! Ви отримаєте грошову винагороду в кінці місяця, якщо станете одним з трьох переможців!
Стань активним учасником руху antibotan!
Поділись актуальною інформацією,
і отримай привілеї у користуванні архівом! Детальніше

Оголошення від адміністратора

Антиботан аватар за замовчуванням

пропонує роботу

Admin

26.02.2019 12:38

Привіт усім учасникам нашого порталу! Хороші новини - з‘явилась можливість кожному заробити на своїх знаннях та вміннях. Тепер Ви можете продавати свої роботи на сайті заробляючи кошти, рейтинг і довіру користувачів. Потрібно завантажити роботу, вказати ціну і додати один інформативний скріншот з деякими частинами виконаних завдань. Навіть одна якісна і всім необхідна робота може продатися сотні разів. «Головою заробляти» продуктивніше ніж руками! :-)

Новини